# 2025.09.30力扣网刷题
# 三维形体的表面积——几何、数学、数组、矩阵——简单
# 给你一个 n * n 的网格 grid ，上面放置着一些 1 x 1 x 1 的正方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格(i, j) 上。
# 放置好正方体后，任何直接相邻的正方体都会互相粘在一起，形成一些不规则的三维形体。
# 请你返回最终这些形体的总表面积。
# 注意：每个形体的底面也需要计入表面积中。
# 示例 1：
# 输入：grid = [[1, 2], [3, 4]]
# 输出：34
# 示例 2：
# 输入：grid = [[1, 1, 1], [1, 0, 1], [1, 1, 1]]
# 输出：32
# 示例 3：
# 输入：grid = [[2, 2, 2], [2, 1, 2], [2, 2, 2]]
# 输出：46
# 提示：
# n == grid.length
# n == grid[i].length
# 1 <= n <= 50
# 0 <= grid[i][j] <= 50

class Solution(object):
    def surfaceArea(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        length, ans = len(grid), 0
        for i in range(length):
            for j in range(length):
                ans += grid[i][j] * 4
                if grid[i][j]:
                    ans += 2
                left, right, front, behind = 0, 0, 0, 0
                if j:
                    left = min(grid[i][j], grid[i][j - 1])
                    right = left
                if i:
                    behind = min(grid[i - 1][j], grid[i][j])
                    front = behind
                ans -= left + right + front + behind
        return ans